package qinggui.mlz.module.utils;


import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * poi工具类
 */
public final class PoiUtils {
    private PoiUtils() {}

    /**
     * 把任意 List<T> 导出成 Excel（反射取字段）
     * @param data      数据
     * @param clazz     泛型类
     * @param sheetName 工作表名
     * @param <T>       泛型
     * @return HSSFWorkbook（03）或 XSSFWorkbook（07）
     */
    public static<T> Workbook export(List<T> data, Class<T> clazz, String sheetName) throws IllegalAccessException {
        // 1. 解析表头
        Field[] fields = clazz.getDeclaredFields();
        List<String> header = new ArrayList<>();
        for (Field f : fields) {
            // 支持 @ExcelHeader 自定义，这里简单用字段名
            header.add(f.getName());
        }

        // 2. 创建 Workbook
        Workbook wb = new XSSFWorkbook();   // 07 格式
        Sheet sheet = wb.createSheet(sheetName);

        // 3. 写表头
        Row row0 = sheet.createRow(0);
        for (int i = 0; i < header.size(); i++) {
            row0.createCell(i).setCellValue(header.get(i));
        }

        // 4. 写数据
        int rowNum = 1;
        for (T t : data) {
            Row row = sheet.createRow(rowNum++);
            for (int i = 0; i < fields.length; i++) {
                fields[i].setAccessible(true);
                Object val = fields[i].get(t);
                row.createCell(i).setCellValue(Objects.toString(val, ""));
            }
        }

        // 5. 自动列宽
        for (int i = 0; i < header.size(); i++) {
            sheet.autoSizeColumn(i);
            sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 12 / 10);
        }
        return wb;
    }
}
